package ru.compft.web.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import ru.compft.common.data.Setting;
import ru.compft.common.services.SystemService;
import ru.compft.web.adapter.SystemPropAdapter;
import ru.compft.web.beans.ErrorBean;
import ru.compft.web.beans.SystemPropBean;
import ru.compft.web.beans.table.SystemPropsTableBean;
import ru.compft.web.view.CurrentView;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * User: VVasiliev
 * Date: 14.06.12
 * Time: 13:43
 * Контроллер для управления системными свойствами
 */
@Controller("systemPropsController")
@RequestMapping("/modules/setting/systemProps")
@Scope("request")
public class SystemPropsController implements Serializable {
    private static final long serialVersionUID = -8963945273468070060L;

    private static final Logger logger = LoggerFactory.getLogger(SystemPropsController.class);

    private static final String DEFAULT_VIEW = "modules/setting/systemProps";
    private static final String PAGEBLE_RECORDS = "pagebleRecords";
    private static final String PAGINATION_BEAN = "paginationBean";

    private static final String BEAN_ID = "beanId";
    public static final String ACTION = "action";

    public SystemPropsController() {
        System.out.println("--------------SystemPropsController constructor -------------------- ");
    }

    @Resource(name = "systemService")
    private SystemService systemService;

    @Resource(name = "currentView")
    private CurrentView currentView;

//    @Resource(name = "systemPropsTableBean")
//    private PaginationBean paginationBean;

    private SystemPropBean selectedBean;

    public SystemPropBean getSelectedBean() {
        return selectedBean;
    }

    public void setSelectedBean(SystemPropBean selectedBean) {
        this.selectedBean = selectedBean;
    }

    /**
     * Инициализация
     * Список всех доступных модулей для приложения
     *
     * @return
     */
//    @ModelAttribute(PAGEBLE_RECORDS)
//    private List<SystemPropBean> init() {
//        System.out.println("Initialisation SystemProps table");
//        final List<Module> allModules = moduleService.getAllModules();
//
//        final Map<String, Module> result = new HashMap<String, Module>();
//        // возвращаем только те модули, у которых стоит признак visible
//        if (!CollectionUtils.isEmpty(allModules)) {
//            for (Module module : allModules) {
//                if (module.isVisible()) {
//                    final String moduleCode = module.getCode();
//                    result.put(moduleCode, module);
//
//                    // далее меппируем страницы этого модуля
//                    final List<ModulePage> pageList = module.getPageList();
//                    if (!CollectionUtils.isEmpty(pageList)) {
//                        final List<ModulePage> resultPages = new ArrayList<ModulePage>();
//
//                        // возвращаем только те страницы, у которых стоит признак visible
//                        for (ModulePage modulePage : pageList) {
//                            if (modulePage.isVisible()) {
//                                // добавим в результирующий список
//                                resultPages.add(modulePage);
//                                // добавим в меп страниц модулей
//                                getPagesMap().put(modulePage.getCode(), modulePage);
//                            }
//                        }
//                        getPagesToModuleMap().put(moduleCode, resultPages);
//                    }
//                }
//            }
//        }
//        // запишем в память модули
//        setAllModulesMap(result);
//
//        // Сортируем оставшиеся модули по полю order
//        ArrayList<Module> moduleArrayList = new ArrayList<Module>(result.values());
//        Collections.sort(moduleArrayList);

    // отдадим отсортированную коллекцию
//        return new ArrayList<SystemPropBean>();
//    }

    /**
     * Отображение по умолчанию. Если не найдется ни одного подходящего handler запроса
     *
     * @return
     */
//    @RequestMapping(method = RequestMethod.GET)
//    public String showDefault() {
//        System.out.println("Show table.");
//        return DEFAULT_VIEW;
//    }

    /**
     * Отображение определенной страницы
     * todo сделать через AJAX
     *
     * @return
     */
    @RequestMapping(method = RequestMethod.GET)
    public String showPage(@RequestParam(value = "page", required = false) String targetPage,
                           @ModelAttribute(PAGINATION_BEAN) SystemPropsTableBean paginationBean,
                           @ModelAttribute(ErrorBean.BEAN_NAME) ErrorBean errorBean,
                           BindingResult result,
                           Model model) {
        System.out.println("Show table. Page = " + targetPage);

        if (logger.isDebugEnabled()) {
            logger.debug("Try get system props list for page = " + targetPage);
        }

        // Если параметра нет, то возвращаем 1-ю страницу.
        int currentPage = 1;
        if (targetPage != null) {
            // валидация корректности ввода
            currentPage = paginationBean.currentPageValidNumber(targetPage, result);
        }

        if (logger.isDebugEnabled()) {
            logger.debug("Set current page = " + currentPage);
        }

        // устанавливаем номер страницы в бин
        paginationBean.setCurrentPage(currentPage);

        // получаем количество записей на странице
        final int recordsPerPage = paginationBean.getRecordsPerPage();

        // считаем начальный индекс - номер страницы умноженный на максимальное количество записей на странице
        // минус 1 делаем потому. что это индекс начала страницы
        final int fromIndex = (currentPage - 1) * recordsPerPage;

        final List<Setting> settingList = systemService.getSettings(fromIndex, recordsPerPage);
        final int totalRecords = systemService.countAllSettings();

        // анализируем общее количество страниц, чтоб их было больше чем запрошенная
        paginationBean.analizeTotalPage(totalRecords, result);
        // если есть ошибки, отображаем страницу по умолчанию
        if (result.hasErrors()) {
            return DEFAULT_VIEW;
        }

        // заполняем некоторые поля для постраничника
        paginationBean.fillPagebleParams(fromIndex, recordsPerPage, settingList, totalRecords);

        if (logger.isDebugEnabled()) {
            logger.debug("Was fount '" + (settingList != null ? settingList.size() : "null") + "' settings");
        }

        if (!CollectionUtils.isEmpty(settingList)) {
            final List<SystemPropBean> modelAttrList = new ArrayList<SystemPropBean>();
            for (Setting setting : settingList) {
                // преобразуем в бин
                final SystemPropBean systemPropBean = new SystemPropBean();
                SystemPropAdapter.copyToBean(setting, systemPropBean);

                modelAttrList.add(systemPropBean);
            }

            // номер страницы в currentView
            currentView.setPage(Integer.toString(currentPage));
            
            //  добавляем атрибут в модель
            model.addAttribute(PAGEBLE_RECORDS, modelAttrList);
        }

        return DEFAULT_VIEW;
    }

    /**
     * Отображение страницы редактирования
     * todo сделать через AJAX
     * @return
     */
    @RequestMapping(method = RequestMethod.POST, params = "action=edit")
    public String showEditPage(@RequestParam(value = BEAN_ID, required = false) String propsId,
                               @ModelAttribute(ErrorBean.BEAN_NAME) ErrorBean errorBean,
                               BindingResult result,
                               Model model) {
        System.out.println("Show edit page for bean = " + propsId);

        return DEFAULT_VIEW;
    }

// Add one attribute
// The return value of the method is added to the model under the name "account"
// You can customize the name via @ModelAttribute("myAccount")

//    @ModelAttribute("selectedBean")
//    public SystemPropBean addAccount(@RequestParam String number) {
////        return accountManager.findAccount(number);
//        return null;
//    }

// Add multiple attributes

//    @ModelAttribute
//    public void populateModel(@RequestParam String number, Model model) {
////        model.addAttribute(accountManager.findAccount(number));
//        // add more ...
//    }

//    @RequestMapping(method = RequestMethod.GET)
//    public String setupForm(@RequestParam(value = "id", required = false) long id, ModelMap model) {
//        // load system property
////        model.addAttribute("systemProp", systemProp);
//        return "editSystemProp";
//    }

//    @RequestMapping(method = RequestMethod.POST)
//    public String save(@ModelAttribute SystemPropBean selectedBean, BindingResult result) {
//        // валидация
//        new SystemPropBeanValidator().validate(selectedBean, result);
//        if (result.hasErrors()) {
//            return "error";
//        }
//        // сохраняем свойство
//        return GlobalConstants.SUCCESS;
//    }

    public void cancelAction() {
        System.out.println("cancelAction = ");
        setSelectedBean(null);
    }
    /**
     * Редактируем свойство
     */
//    public String editSelected() {
//        if (logger.isDebugEnabled()) {
//            logger.debug("Edit selected property...");
//        }
//
//        final ServletRequest servletRequest = (ServletRequest) FacesUtils.getExternalContext().getRequest();
//        final String beanId = servletRequest.getParameter(BEAN_ID);
//
//        if(StringUtils.hasText(beanId)){
//            if (logger.isDebugEnabled()) {
//                logger.debug("Selected property with id = " + beanId);
//            }
//        }else{
//            // todo сделать через файл messages
//            FacesUtils.addWarnMessage(null, "Записи не выбраны");
//        }
////        beanId
//        System.out.println("EDIT ACTION = " + beanId);
//
//        servletRequest.setAttribute("id", beanId);
//        return "";
//    }
}
